﻿#region Usings

using System;
using System.Data.Entity;
using System.Linq;
using DbConvertor.Dao;
using DbConvertor.Dao.Config;
using DbConvertor.Dao.Entities;
using DbConvertor.Data;

#endregion

namespace DbConvertor
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            //var res = "";
            //for (var i = 0; i < 30; i++)
            //{
            //    res += Guid.NewGuid() + Environment.NewLine;
            //}


            Database.SetInitializer(new DbInitializer());
            //var railnetContext = new RailnetContext();
            //railnetContext.Database.Initialize(true);

            //using (var oldContext = new ExtendedModelContainer())
            //{
            //    using (var newContext = new RailnetContext())
            //    {
            //        #region Stations import

            //        //var haltestellen = from st in oldContext.Haltestellen
            //        //                   select st;

            //        //foreach (var haltestelle in haltestellen)
            //        //{
            //        //    var station = new Station
            //        //                      {
            //        //                          Eva = haltestelle.Eva,
            //        //                          Epa = haltestelle.Epa,
            //        //                          Name = haltestelle.Name,
            //        //                          Tisp = haltestelle.Tisp,
            //        //                          ForSale = haltestelle.ForSale.Value,
            //        //                          X = haltestelle.X,
            //        //                          Y = haltestelle.Y,
            //        //                          IsBorder = false,
            //        //                          Ru =
            //        //                              newContext.Rus.SingleOrDefault(
            //        //                                  ru => ru.Code == haltestelle.Eva.Substring(0, 2))
            //        //                      };
            //        //    newContext.Stations.Add(station);
            //        //}
            //        //newContext.SaveChanges();

            //        #endregion

            //        #region Relation import

            //        var allStationEvas = newContext.Stations.Where(s => s.Eva != null).Select(s => s.Eva);

            //        var tcvRelations = from rel in oldContext.TcvRelationen
            //                           where
            //                               rel.ValidFrom <= DateTime.Now && rel.ValidTo >= DateTime.Now &&
            //                               (oldContext.TcvRels.Where(b => b.ValidFrom <= DateTime.Now && b.ValidTo >= DateTime.Now && allStationEvas.Contains(b.BorderStation)).Select(a => a.RelationNumber).Contains(rel.RelationNumber) ||
            //                               oldContext.TcvDests.Where(b => b.ValidFrom <= DateTime.Now && b.ValidTo >= DateTime.Now && allStationEvas.Contains(b.DestinationStation)).Select(a => a.RelationNumber).Contains(rel.RelationNumber) ||
            //                               oldContext.TcvVias.Where(b => b.ValidFrom <= DateTime.Now && b.ValidTo >= DateTime.Now && allStationEvas.Contains(b.ViaStation)).Select(a => a.RelationNumber).Contains(rel.RelationNumber))
            //                           select rel;

            //        foreach (var tcvRelation in tcvRelations)
            //        {
            //            var relation = new Relation
            //                                {
            //                                    RelationNumber = Int32.Parse(tcvRelation.RelationNumber),
            //                                    Route = tcvRelation.Route,
            //                                    ValidFrom = tcvRelation.ValidFrom,
            //                                    ValidTo = tcvRelation.ValidTo,
            //                                    BorderStation =
            //                                        String.Format("{0}{1:000000}",
            //                                                        tcvRelation.BorderStationRu.PadLeft(4, '0').
            //                                                            PadRight(
            //                                                                6, '0'),
            //                                                        Int32.Parse(tcvRelation.BorderStationNumber)),
            //                                    DestinationStation =
            //                                        String.Format("{0:000000000000}",
            //                                                        Int64.Parse(tcvRelation.DestinationStation))
            //                                };
            //            newContext.Relations.Add(relation);

            //            short index = 1;
            //            if (tcvRelation.Ru1 != "0")
            //            {
            //                var ruCode = tcvRelation.Ru1.PadLeft(6, '0').Substring(2, 2);
            //                var relationRu = new RelationRu
            //                                        {
            //                                            SequenceNumber = index,
            //                                            Distance = tcvRelation.Distance1,
            //                                            Serial = tcvRelation.SerialPrice1,
            //                                            Ru = newContext.Rus.SingleOrDefault(ru => ruCode == ru.Code),
            //                                            Relation = relation
            //                                        };
            //                if (relationRu.Ru == null)
            //                {
            //                    var a = 9;
            //                }
            //                newContext.RelationRus.Add(relationRu);
            //                index++;
            //            }
            //            if (tcvRelation.Ru2 != "0")
            //            {
            //                var ruCode = tcvRelation.Ru2.PadLeft(6, '0').Substring(2, 2);
            //                var relationRu = new RelationRu
            //                                        {
            //                                            SequenceNumber = index,
            //                                            Distance = tcvRelation.Distance2,
            //                                            Serial = tcvRelation.SerialPrice2,
            //                                            Ru = newContext.Rus.SingleOrDefault(ru => ruCode == ru.Code),
            //                                            Relation = relation
            //                                        };
            //                if (relationRu.Ru == null)
            //                {
            //                    var a = 9;
            //                }
            //                newContext.RelationRus.Add(relationRu);
            //                index++;
            //            }
            //            if (tcvRelation.Ru3 != "0")
            //            {
            //                var ruCode = tcvRelation.Ru3.PadLeft(6, '0').Substring(2, 2);
            //                var relationRu = new RelationRu
            //                                        {
            //                                            SequenceNumber = index,
            //                                            Distance = tcvRelation.Distance3,
            //                                            Serial = tcvRelation.SerialPrice3,
            //                                            Ru = newContext.Rus.SingleOrDefault(ru => ruCode == ru.Code),
            //                                            Relation = relation
            //                                        };
            //                if (relationRu.Ru == null)
            //                {
            //                    var a = 9;
            //                }
            //                newContext.RelationRus.Add(relationRu);
            //                index++;
            //            }
            //            if (tcvRelation.Ru0 != "0")
            //            {
            //                var ruCode = tcvRelation.Ru0.PadLeft(6, '0').Substring(2, 2);
            //                var relationRu = new RelationRu
            //                                        {
            //                                            SequenceNumber = index,
            //                                            Distance = tcvRelation.Distance0,
            //                                            Serial = tcvRelation.SerialPrice0,
            //                                            Ru = newContext.Rus.SingleOrDefault(ru => ruCode == ru.Code),
            //                                            Relation = relation
            //                                        };
            //                if (relationRu.Ru == null)
            //                {
            //                    var a = 9;
            //                }
            //                newContext.RelationRus.Add(relationRu);
            //            }

            //            var borders = from b in oldContext.TcvRels
            //                          where b.RelationNumber == tcvRelation.RelationNumber &&
            //                          b.ValidFrom <= DateTime.Now && b.ValidTo >= DateTime.Now
            //                          select b;
            //            foreach (var tcvRel in borders)
            //            {
            //                var relationDescription = new RelationDescription
            //                                                {
            //                                                    Relation = relation,
            //                                                    Included = true,
            //                                                    Station =
            //                                                        newContext.Stations.SingleOrDefault(
            //                                                            s => s.Eva == tcvRel.BorderStation),
            //                                                    StationType = 1,
            //                                                    ValidFrom = tcvRel.ValidFrom,
            //                                                    ValidTo = tcvRel.ValidTo
            //                                                };
            //                if (relationDescription.Station == null)
            //                {
            //                    var a = 9;
            //                }
            //                newContext.RelationDescriptions.Add(relationDescription);
            //            }
            //            var vias = from b in oldContext.TcvVias
            //                       where b.RelationNumber == tcvRelation.RelationNumber &&
            //                       b.ValidFrom <= DateTime.Now && b.ValidTo >= DateTime.Now
            //                       select b;
            //            foreach (var tcvVia in vias)
            //            {
            //                var relationDescription = new RelationDescription
            //                                                {
            //                                                    Relation = relation,
            //                                                    Included = tcvVia.Included.Value,
            //                                                    Station =
            //                                                        newContext.Stations.SingleOrDefault(
            //                                                            s => s.Eva == tcvVia.ViaStation),
            //                                                    StationType = 2,
            //                                                    ValidFrom = tcvVia.ValidFrom,
            //                                                    ValidTo = tcvVia.ValidTo
            //                                                };
            //                if (relationDescription.Station == null)
            //                {
            //                    var a = 9;
            //                }
            //                newContext.RelationDescriptions.Add(relationDescription);
            //            }
            //            var dests = from b in oldContext.TcvDests
            //                        where b.RelationNumber == tcvRelation.RelationNumber &&
            //                        b.ValidFrom <= DateTime.Now && b.ValidTo >= DateTime.Now
            //                        select b;
            //            foreach (var tcvDest in dests)
            //            {
            //                var relationDescription = new RelationDescription
            //                                                {
            //                                                    Relation = relation,
            //                                                    Included = tcvDest.Included.Value,
            //                                                    Station =
            //                                                        newContext.Stations.SingleOrDefault(
            //                                                            s => s.Eva == tcvDest.DestinationStation),
            //                                                    StationType = 3,
            //                                                    ValidFrom = tcvDest.ValidFrom,
            //                                                    ValidTo = tcvDest.ValidTo
            //                                                };
            //                if (relationDescription.Station == null)
            //                {
            //                    var a = 9;
            //                }
            //                newContext.RelationDescriptions.Add(relationDescription);
            //            }
            //        }
            //        newContext.SaveChanges();

            //        #endregion

            //        #region Price distances import

            //        //var tcvps = from p in oldContext.Tcvps
            //        //            where p.ValidFrom <= DateTime.Now && p.ValidTo >= DateTime.Now
            //        //            select p;
            //        //foreach (var tcvp in tcvps)
            //        //{
            //        //    var ruCode = tcvp.Ru.PadLeft(6, '0').Substring(2, 2);
            //        //    var ru = newContext.Rus.SingleOrDefault(r => r.Code == ruCode);
            //        //    if (ru != null)
            //        //    {
            //        //        var priceDistance = new PriceDistance
            //        //                                {
            //        //                                    Class = tcvp.Class,
            //        //                                    TarifNumber = tcvp.TarifNumber,
            //        //                                    ZoneFrom = tcvp.ZoneFrom,
            //        //                                    ZoneTo = tcvp.ZoneTo,
            //        //                                    Price = tcvp.Price,
            //        //                                    ValidFrom = tcvp.ValidFrom,
            //        //                                    ValidTo = tcvp.ValidTo,
            //        //                                    Ru = ru
            //        //                                };
            //        //        newContext.PriceDistances.Add(priceDistance);
            //        //    }
            //        //}
            //        //newContext.SaveChanges();

            //        #endregion

            //        #region Price domestics import

            //        //var domesticPrices = from p in oldContext.DomesticPrices
            //        //                     where p.ValidFrom <= DateTime.Now && p.ValidTo >= DateTime.Now
            //        //                     select p;
            //        //foreach (var domesticPrice in domesticPrices)
            //        //{
            //        //    var priceDomestic = new PriceDomestic
            //        //    {
            //        //        Class = domesticPrice.Class,
            //        //        TarifNumber = domesticPrice.TarifNumber,
            //        //        ZoneFrom = domesticPrice.ZoneFrom,
            //        //        ZoneTo = domesticPrice.ZoneTo,
            //        //        Price = domesticPrice.Price,
            //        //        TrainType = domesticPrice.TrainType,
            //        //        ValidFrom = domesticPrice.ValidFrom,
            //        //        ValidTo = domesticPrice.ValidTo,
            //        //        SubRu = domesticPrice.Ru
            //        //    };
            //        //    newContext.PriceDomestics.Add(priceDomestic);
            //        //}
            //        //newContext.SaveChanges();

            //        #endregion

            //        #region Price serials import

            //        //var tcvSeries = from p in oldContext.TcvSerien
            //        //                where p.ValidFrom <= DateTime.Now && p.ValidTo >= DateTime.Now
            //        //                select p;
            //        //foreach (var tcvSerie in tcvSeries)
            //        //{
            //        //    var ruCode = tcvSerie.Ru.PadLeft(6, '0').Substring(2, 2);
            //        //    var ru = newContext.Rus.SingleOrDefault(r => r.Code == ruCode);
            //        //    if (ru != null)
            //        //    {
            //        //        var priceSerial = new PriceSerial
            //        //                                {
            //        //                                    Class = tcvSerie.Class,
            //        //                                    TarifNumber = tcvSerie.TarifNumber,
            //        //                                    Serial = tcvSerie.Serial,
            //        //                                    Price = tcvSerie.Price,
            //        //                                    ValidFrom = tcvSerie.ValidFrom,
            //        //                                    ValidTo = tcvSerie.ValidTo,
            //        //                                    Ru = ru
            //        //                                };
            //        //        newContext.PriceSerials.Add(priceSerial);
            //        //    }
            //        //}
            //        //newContext.SaveChanges();

            //        #endregion

            //        #region Distances import

            //        //var stations = from s in newContext.Stations
            //        //               select s;

            //        //var tisps = from h in oldContext.Haltestellen
            //        //            where h.Tisp != null
            //        //            select h.Tisp;

            //        //var entfernungen = from d in oldContext.Entfernungen
            //        //                   where tisps.Contains(d.TispTisp.Substring(0, 4)) && tisps.Contains(d.TispTisp.Substring(4, 4))
            //        //                   select d;

            //        //foreach (var entfernung in entfernungen)
            //        //{
            //        //    var tisp1 = entfernung.TispTisp.Substring(0, 4);
            //        //    var tisp2 = entfernung.TispTisp.Substring(4, 4);
            //        //    var stations1 = stations.Where(s => s.Tisp == tisp1);
            //        //    var stations2 = stations.Where(s => s.Tisp == tisp2);

            //        //    foreach (var station1 in stations1)
            //        //    {
            //        //        foreach (var station2 in stations2)
            //        //        {
            //        //            var distance = new Distance
            //        //            {
            //        //                TispTisp = entfernung.TispTisp,
            //        //                Sbb = entfernung.Sbb,
            //        //                Db = entfernung.Db,
            //        //                Oebb = entfernung.Oebb,
            //        //                Mav = entfernung.Mav,
            //        //                P10 = entfernung.P10,
            //        //                P20 = entfernung.P20,
            //        //                P30 = entfernung.P30,
            //        //                P31 = entfernung.P31,
            //        //                P40 = entfernung.P40,
            //        //                P41 = entfernung.P41,
            //        //                P42 = entfernung.P42,
            //        //                P43 = entfernung.P43,
            //        //                P50 = entfernung.P50,
            //        //                P51 = entfernung.P51,
            //        //                P52 = entfernung.P52,
            //        //                P53 = entfernung.P53,
            //        //                P60 = entfernung.P60,
            //        //                P80 = entfernung.P80,
            //        //                P81 = entfernung.P81,
            //        //                Station1 = station1,
            //        //                Station2 = station2
            //        //            };
            //        //            newContext.Distances.Add(distance);
            //        //        }
            //        //    }
            //        //    newContext.SaveChanges();
            //        //}

            //        #endregion
            //    }
            //}
        }
    }
}